package jm.nj.demo13mian.demo11;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
* 多线程安全问题的Look锁解决方案
* java.util.concurrent.looks.Lock接口
* 常用的方法
* lock:获取锁
* unlock:释放锁
*
* ReentrantLock implements Lock接口
*
* 使用步骤:
*   1.在类的成员位置创建一个Lock接口的实现类对象
*   2.在可能出现安全问题的代码块前调用lock方法,获取锁
*   3.在可能出现安全问题的代码块后调用unlock方法,释放锁
*
*
* */
public class RunnableImpl implements Runnable{
    //定义共享票源
    private int ticket = 10;

    Lock lock = new ReentrantLock();

    @Override
    public void run() {
        //设置死循环,让3个线程买票,重复执行
        while (true){
            lock.lock();
            if(ticket>0){
                try {
                    Thread.sleep(10);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName()+"...正在买第"+ticket--+"张票");

            }
            lock.unlock();
        }
    }
}
